﻿#include<iostream>
#include<set>
#include<map>
using namespace  std;

//void test1()
//{
//	set<int> t({ 1,2,3,4,5,6,7,8,9,10 });
//	//正向迭代器
//	set<int>::iterator it = t.begin();
//	while (it != t.end())
//	{
//		cout << *it << " ";
//		it++;
//	}
//	cout << endl;
//	//反向迭代器
//	set<int>::reverse_iterator rit = t.rbegin();
//	while (rit != t.rend())
//	{
//		cout << *rit << " ";
//		rit++;
//	}
//}
//void test2()
//{
//	//插入单值
//	//去重，升序
//	set<int> t1;
//	//去重，降序
//	//set<int,greater<int>> t1;
//	t1.insert(1);
//	t1.insert(2);
//	t1.insert(3);
//	t1.insert(1);//将会插入失败
//
//	//set<int>::iterator it = t1.begin();
//	auto it = t1.begin();
//	while (it != t1.end())
//	{
//		cout << *it << " ";
//		++it;
//	}
//	cout << endl;
//
//	//列表插入
//	t1.insert({ 4,2,3,6,7 });//已经插入的值会插入失败
//	for (auto& e : t1)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	//迭代器插入
//	set<string> strset = { "sort", "insert", "add" };
//	// 遍历string⽐较ascll码⼤⼩顺序遍历的
//		for (auto& e : strset)
//		{
//			cout << e << " ";
//		}
//	cout << endl;
//} 
//void test3()
//{
//	set<int> t({ 2,5,8,7,9,6,3 });
//	for (auto e : t)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	//删除最小的值
//	t.erase(t.begin());
//	for (auto e : t)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//	
//	//直接删除
//	int x;
//	cin >> x;
//	int num = t.erase(x);
//	if (num == 0)
//	{
//		cout << x << "不存在！" << endl;
//	}
//	for (auto e : t)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	//直接查找在利⽤迭代器删除
//	cin >> x;
//	auto pos = t.find(x);
//	if (pos != t.end())
//	{
//		t.erase(pos);
//	}
//	else
//	{
//		cout << x << "不存在！" << endl;
//	}
//
//	for (auto e : t)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//
//	// 算法库的查找O(N)
//	auto pos1 = find(t.begin(), t.end(), x);
//	// set⾃⾝实现的查找O(logN)
//	auto pos2 = t.find(x);
//
//	// 利⽤count间接实现快速查找
//	cin >> x;
//	if (t.count(x))
//	{
//		cout << x << "在！" << endl;
//	}
//	else
//	{
//		cout << x << "不存在！" << endl;
//	}
//
//}
//void test4()
//{
//	//相⽐set不同的是，multiset是排序，但是不去重
//	multiset<int> t;
//	t.insert(3);
//	t.insert(1);
//	t.insert(3);  // 可以插入相同元素
//	t.insert(2);
//	t.insert(2);
//	for (int ch : t) {
//		cout << ch << " ";
//	}
//	cout << endl;
//
//	int x;
//	cin >> x;
//	//multiset<int>::iterator pos1 = t.find(x);
//	auto pos = t.find(x);
//	//相比于set，multiset的find寻找的是相同的第一个值
//	while (pos != t.end() && *pos == x)
//	{
//		cout << *pos << " ";
//		++pos;
//	}
//	cout << endl;
//
//	// 相⽐set不同的是，count会返回x的实际个数
//	cout <<t.count(x) << endl;
//
//	// 相⽐set不同的是，erase给值时会删除所有的x
//	t.erase(x);
//	for (auto e : t)
//	{
//		cout << e << " ";
//	}
//	cout << endl;
//}

//void test1()
//{
//	// initializer_list构造及迭代遍历
//	map<string, string> dict = { {"书","book"},{"水果","fruit"} };
//
//	pair<string, string> son("玩偶", "dool");
//	dict.insert(son);
//
//	dict.insert(pair<string, string>("计算机", "computer"));
//
//	dict.insert(make_pair("自动", "auto"));
//
//	dict.insert({ "排序","sort" });
//
//	auto d = dict.insert({ "品种","sort" });
//	if (d.second == 0) cout << "插入失败";
//	else cout << "插入成功";
//
//	for (const auto& e : dict)
//	{
//		cout << e.first << ":" << e.second << endl;
//	}
//	cout << endl;
//
//
//	string str;
//	while (cin >> str)
//	{
//		auto ret = dict.find(str);
//		if (ret != dict.end())
//		{
//			cout << "->" << ret->second << endl;
//		}
//		else
//		{
//			cout << "无此单词，请重新输入" << endl;
//		}
//	}
//}
//void test2()
//{
//	map<string, string> dict;
//	dict.insert({ "sort","排序" });
//	dict["insert"];
//
//	//插入+修改
//	dict["left"] = "左边";
//	//修改
//	dict["left"] = "左边、剩余";
//	// key存在->查找
//	cout << dict["left"] << endl;
//}
//void test3()
//{
//	map<string, string> t;
//	//插入
//	t["first"] = "1";
//	t["second"] = "2";
//	t["third"] = "3";
//
//	map<string, string>::iterator it = t.begin();
//	while (it != t.end())
//	{
//		cout <<"<" << it->first << "," << it->second << ">"<<" ";
//		it++;
//	}
//	cout << endl;
//
//	//插入+修改
//	t["first"] = "一";
//	t["second"] = "二";
//	t["third"] = "三";
//	it = t.begin();
//	while (it != t.end())
//	{
//		cout << "<" << it->first << "," << it->second << ">" << " ";
//		it++;
//	}
//}
//void test4()
//{
//	multimap<string, string> t;
//	t.insert({ "1", "first" });
//	t.insert({ "1", "one" });
//	t.insert({ "2", "second" });
//	t.insert({ "2", "two" });
//	t.insert({ "3", "thrid" });
//	auto it = t.begin();
//	while (it != t.end())
//	{
//		cout << "<" << it->first << "," << it->second << ">" << " ";
//		it++;
//	}
//}
//void test5()
//{
//	map<int,string> t;
//	t.insert({ 1, "one" });
//	t.insert({ 2, "two" });
//	t.insert({ 3, "three" });
//	//正向迭代器
//	map<int,string>::iterator it = t.begin();
//	while (it != t.end())
//	{
//		cout << "<" << it->first << "," << it->second << ">" << " ";
//		it++;
//	}
//	cout << endl;
//	//反向迭代器
//	map<int, string>::reverse_iterator rit = t.rbegin();
//	while (rit != t.rend())
//	{
//		cout << "<" << rit->first << "," << rit->second << ">" << " ";
//		++rit;
//	}
//	cout << endl;
//}
//int main()
//{
//	test5();
//	return 0;
//}
//
//class Date
//{
//	Date(int year = 1,int month = 1,int day = 1)
//		:_year(year)
//		,_month(month)
//		,_day(day)
//	{}
//private:
//	int _year;
//	int _month;
//	int _day;
//};
//class QQ {
//public:
//    //加上explicit就不支持隐私类型转换
//    //explicit QQ(int q1) 
//    QQ(int q1)
//    {
//        qq1 = q1;
//        cout << "QQ constructed with int: " << q1 << endl;
//    }
//    //explicit QQ(int q1, int q2)
//    QQ(int q1, int q2)
//        :qq1(q1)
//        ,qq2(q2)
//    {}
//    void show() const {
//        cout << "Value: " << qq1 << qq2 << endl;
//    }
//
//private:
//    int qq1;
//    int qq2;
//};
//
//int main() {
//    //构造⼀个QQ的临时对象，再⽤这个临时对象拷⻉构造a3
//    // 编译器遇到连续构造+拷⻉构造->优化为直接构造
//    QQ  a = 1;
//    a.show();
//
//    const QQ& a2 = 1;
//
//    //C++11之后才⽀持多参数转化
//    QQ a3 = { 3,3 };
//
//    return 0;
//}


//int main() {
//   string s = "hello";
//   // 获取字符串的起始迭代器
//   string::iterator it = s.begin();
//   // 使用 for 循环通过迭代器遍历字符串
//    for (it = s.begin(); it != s.end(); it++) 
//    {
//       cout << *it;
//    }
//    cout <<  endl;
//
//    // 使用 while 循环通过迭代器遍历字符串
//    it = s.begin();
//    while (it != s.end())
//    {
//        cout << *it;
//        it++;
//    }
//    cout <<  endl;
//    return 0;
//}

//int main() {
//	
//    string s = "hello";
//    string::reverse_iterator it = s.rbegin();
//    // 使用 for 循环通过迭代器反向遍历字符串
//    for (it = s.rbegin(); it != s.rend(); it++)
//    {
//        cout << *it;
//    }
//    cout << endl;
//
//    // 使用 while 循环通过迭代反向器遍历字符串
//    it = s.rbegin();
//    while (it != s.rend())
//    {
//        cout << *it;
//        it++;
//    }
//    cout << endl;
//    return 0;
//}
//int main()
//{
//	string s("hello world!");
//	const char* cstr = "Hello, C++!";
//
//	string str1;  // 使用默认构造函数创建一个空字符串
//	string str2(s);// 使用拷贝构造函数
//	string str3(s,6,6);// 从位置6开始，长度为6的子字符串
//	string str4(cstr);// 从C字符串创建
//	string str5(cstr, 5);  // 从C字符串的前5个字符创建
//	string str6(10, 'x');  // 创建包含10个'x'字符的字符串
//	string str7(str6.begin(), str6.end());  // 从string str6的范围创建字符串
//	
//
//	cout << "str1: \"" << str1 << "\"" << endl;
//	cout << "str2: \"" << str2 << "\"" << endl;
//	cout << "str3: \"" << str3 << "\"" << endl;
//	cout << "str4: \"" << str4 << "\"" << endl;
//	cout << "str5: \"" << str5 << "\"" << endl;
//	cout << "str6: \"" << str6 << "\"" << endl;
//	cout << "str7: \"" << str7 << "\"" << endl;
//	return 0;
//}
//int main()
//{
//	string s("Hello World");
//
//	cout << s.size() << endl;//字符串长度
//	cout << s.length() << endl;//字符串长度
//	cout << s.capacity() << endl;//s空间大小
//	cout << s.max_size() << endl;//s最大容量
//
//	return 0;
//}
//int main()
//{
//	string s;
//	// 提前开空间，避免扩容，提高效率
//	size_t sz = s.capacity();
//	cout << "old capacity: " << sz << '\n';
//
//	cout << "making s grow:\n";
//	for (int i = 0; i < 100; ++i)
//	{
//		s.push_back('c');
//		if (sz != s.capacity())
//		{
//			sz = s.capacity();
//			cout << "capacity changed: " << sz << '\n';
//		}
//	}
//	return 0;
//}
void StringTest1()
{
	string s("Hello World!");
	for (int i = 0; i < s.size(); i++)
	{
		cout << s[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < s.size(); i++)
	{
		cout << s.at(i) << " ";
	}
}
void  StringTest2()
{
	string s("Hello World");
	cout << s.front() << " ";
	cout << s.back() << " ";
}
void  StringTest3()
{
	string s1("This");
	string s2("is");
	s1 += s2; //追加一个string类型的字符串
	s1 += "cpp.exe";//追加一个字符串
	s1 += '!';//追加一个字符
}
void StringTest4()
{
	string s;
	s.append("Hello");          // "Hello"
	s.append(", ");             // "Hello, "
	s.append("World");          // "Hello, World"
	s.append(1, '!');           // "Hello, World!"
	s.append(s);
	s.append(" Have a nice day!"); // "Hello, World!Hello, World! Have a nice day!"
	s.push_back('!');     //尾插一个字符！
}
void StringTest5()
{
	string s1("Hello World!");
	string s2("Hello Shawn!");
	cout << "交换前：" << endl;
	cout << "s1：" << s1 << endl;
	cout << "s2：" << s2 << endl;

	s1.swap(s2);
	cout << "交换后：" << endl;
	cout <<"s1：" << s1 << endl;
	cout << "s2：" << s2 << endl;

	// 目标字符数组
	char buffer[20];
	// 从s2的第 6 个字符开始，复制 5 个字符到 buffer
	size_t sz = s2.copy(buffer, 5, 6);
	buffer[sz] = '\0';

	cout <<  buffer << endl;
}
void StringTest6()
{
	string s ("Hello, World!");
	// 序列删除，删除"World"，结果为"Hello, !"。
	s.erase(7, 5);
	// 删除单个字符，删除','，结果为"Hello 
	s.erase(s.begin() + 5);
	// 删除字符范围，删除' '后的所有字符，结果为"Hello"
	s.erase(s.begin() + 5, s.end());
	s.pop_back();//尾删
}
void StringTest7()
{
	string str = "Hello, World!";
	string str1 = "C++ ";
	string str2 = "12345";
	str.insert(7, str2);  // 在位置 7 插入 "C++ " 
	str.insert(11, "haha", 0, 5);  // 在位置 11 插入 "haha"
	str.insert(16, " good!");  // 在位置 16 插入 "good"
	str.insert(16, "one", 8);  // 在位置 16 插入 "one "
	str.insert(24, 3, '!');  // 在位置 24 插入 3 个 '!'
	str.insert(str.begin() + 5, '!');  // 在位置 5 插入 '!'
	str.insert(str.begin() + 10, str2.begin(), str2.end());
	cout << str << endl;
}
void StringTest8()
{
	string str = "Hello, World!";

	// 使用 assign 赋值
	str.assign("C++ Programming");  // 用 C 风格字符串赋值
	cout << "After assign: " << str << endl;  // 输出 "C++ Programming"

	// 使用 replace 替换
	str.replace(4, 11, "is fun!");  // 从位置 4 开始，替换 11 个字符为 "is fun!"
	cout << "After replace: " << str << endl;  // 输出 "C++ is fun!"

	// 再次使用 assign 赋值
	str.assign(10, '*');  // 用 10 个 '*' 赋值
	cout << "After assign with fill: " << str << endl;  // 输出 "**********"

	// 再次使用 replace 替换
	str.replace(5, 2, "C++");  // 从位置 5 开始，替换 2 个字符为 "C++"
	cout << "After replace: " << str << endl;  // 输出 "*****C++**"
}
void StringTest9()
{
	string s1("Hello world!");
	string s2("ll");
	size_t a = s1.find(s1,0);//找单个字符,不传默认从0开始找。
	a = s1.find("Hello");//找字符串，不传默认从0开始找
	a = s1.find("world!", 4, 6);//找字符串，从4开始找，最多6个字符
	a = s1.find('H', 0);//找单个字符,不传默认从0开始找。
}
void StringTest10()
{
	string str("Please, replace the vowels in this sentence by asterisks.");
	cout << str << '\n';

	size_t found = str.find_first_not_of("abcdef");
	while (found != string::npos)
	{
		str[found] = '*';
		found = str.find_first_not_of("abcdef", found + 1);
	}
	cout << str << '\n';
}
void StringTest11()
{	
	string s("hello world!");
	size_t pos = s.find('w');
	//从下标6开始截取长度为6的字符串
	string str = s.substr(pos, 6);
	cout << str << endl;
}
void StringTest12()
{
	 string str = "example";
	// reserve操作
	 cout << "reserve操作前：" <<  endl;
	 cout << "字符串内容: " << str <<  endl;
	 cout << "字符串长度: " << str.size() <<  endl;
	 cout << "字符串容量: " << str.capacity() <<  endl;
	str.reserve(15);
	 cout << "reserve操作后：" <<  endl;
	 cout << "字符串内容: " << str <<  endl;
	 cout << "字符串长度: " << str.size() <<  endl;
	 cout << "字符串容量: " << str.capacity() <<  endl;

	// resize操作
	 cout << "\nresize操作前：" <<  endl;
	 cout << "字符串内容: " << str <<  endl;
	 cout << "字符串长度: " << str.size() <<  endl;
	 cout << "字符串容量: " << str.capacity() <<  endl;
	str.resize(10, '!');
	 cout << "resize操作后：" <<  endl;
	 cout << "字符串内容: " << str <<  endl;
	 cout << "字符串长度: " << str.size() <<  endl;
	 cout << "字符串容量: " << str.capacity() <<  endl;
}
void StringTest13()
{
	string s("Hello World!");
	for (auto x : s)
	{
		cout << x;
	}
	cout << endl;
}
int main()
{
	StringTest13();
	return 0;
}